// 范型 generics
// 在声明函数 接口 的时候不指定数据类型 而是在使用的时候给一个数据类型 
// 尖括号是范型的语法特点

let arr5: Array<number> = [1, 2, 3]
//1.用范型定义一个数组

function fun1(x: number, y: number): number {
    return x + y
}

// 2.用范型声明函数 范型也可以定义多个

function fun2<T, U>(x: T, y: U): T {
    return x
}
fun2<string, number>("20", 20)


//3.用范型定义接口 
// 可以理解为在声明的时候指定了两个 类型的形参，在调用的时候 传了两个类型的实参
// 在定义接口的时候 就在接口的名字后面加上尖括号定义范型
interface Myobj2<T, U> {
    name: T,
    age: U
}

let obj4: Myobj2<string, number> = {
    name: "xiaoming",
    age: 18
}
let obj5: Myobj2<string, boolean> = {
    name: "xxx",
    age: true
}

interface Iarray<T> {
    [prop: number]: T
}
//用接口定义数组  加上范型 指定数组的类型

let arr6: Iarray<number> = [1, 2, 3]
let arr7: Iarray<number | string> = [1, 2, 3, "233"]
// 就相当于是我们自己定义了一个数组类型的接口跟直接用范型定义数组（下面的代码）是一样的道理

let arr52: Array<number> = [1, 2, 3]
//1.用范型定义一个数组



